【记录】将QT上绘制的PRPD图谱转为vs+DUILIB绘制中遇到的问题 |
您所在的位置:网站首页 › prpd prps典型图谱 › 【记录】将QT上绘制的PRPD图谱转为vs+DUILIB绘制中遇到的问题 |
这里写自定义目录标题
QT绘制PRPD图谱转为vs+DUILIB绘制总结
QT绘制PRPD
在Qt上先将图谱绘制到位图中,然后再将位图绘制到QWidget上,这样外部窗口变换大小都不会影响到图谱的准确性。 m_Bitmap->fill(Qt::transparent);//用透明色填充 QPainter m_MemDC(m_Bitmap); QPainter* m_MemDCBK=pDC; QRect rectBK = rect; m_MemDCBK->fillRect(rectBK,QColor(0,0,0)); m_MemDCBK->setPen(QColor(255,255,255)); QRect rectFP = QRect(0,0,FP_X,FP_Y); m_MemDC.fillRect(rectFP,m_colorBK); QPen GrayPen(m_colorBKLine,0,Qt::SolidLine); m_MemDC.setPen(GrayPen); m_MemDC.drawLine(rectFP.left(),rectFP.top()+rectFP.height()/2,rectFP.right(),rectFP.top()+rectFP.height()/2); int nOldY = rectFP.top()+rectFP.height()/2; int nY = rectFP.top()+rectFP.height()/2; for(int k=rectFP.left();k nTypeValue = FP_Y/2; } else if(g_nFPType == 1) { nTypeValue = FP_Y; } for(int i=0;i move_num=move_num+FP_X; } int phase_move_num; //定义旋转多少相位 phase_move_num=move_num%FP_X; for(int j=0;j if(m_colorBK!=GetFPColor(m_sStateMap[i][j])) { m_MemDC.setPen(GetFPColor(m_sStateMap[i][j])); m_MemDC.drawPoint(QPointF(i,j)); } } } } m_MemDCBK->setFont(QFont("Times",8,QFont::Black)); m_MemDCBK->drawPixmap(30,0,rect.width()-30,rect.height()-20,*m_Bitmap,0,0,FP_X,FP_Y); m_MemDC.end(); m_MemDCBK->end(); 图谱转为vs+DUILIB绘制刚将代码放到duilib框架中时,想的是直接绘制出来 void xxx::PaintBkImage(HDC hDC) { int32_t left = m_rcItem.left; int32_t right = m_rcItem.right - 1; int32_t top = m_rcItem.top; int32_t bottom = m_rcItem.bottom - 1; int32_t width = right - left; int32_t height = bottom - top; RECT rc_line = { 0 }; rc_line.left = 0; rc_line.top = height / 2; rc_line.right = width; rc_line.bottom = height / 2; CRenderEngine::DrawLine(memdc, rc_line, 2, m_colorBKLine); int nOldY = height / 2; int nY = height / 2; for (int k = 0; k int nTypeValue; if (g_nFPType == 0) { nTypeValue = FP_Y / 2; } else if (g_nFPType == 1) { nTypeValue = FP_Y; } for (int i = 0; i move_num=move_num+FP_X; } int phase_move_num; //定义旋转多少相位 phase_move_num=move_num%FP_X; for (int j = 0; j if (m_colorBK != GetFPColor(m_sStateMap[i][j])) { HPEN pen = CreatePen(PS_SOLID, 2, GetFPColor(m_sStateMap[i][j])); HGDIOBJ old_pen = SelectObject(hDC, pen); Ellipse(hDC, i, j, i + 1, j + 1); SelectObject(hDC, old_pen); DeletePen(pen); } } } } }这样就遇到了一个很严重的问题,背景正弦曲线虽然会跟着窗口大小变动而变动,但图谱的数据却重新分布重新绘制了。所以还是得使用位图来绘制。 void xxx::PaintBkImage(HDC hDC) { HDC memdc = CreateCompatibleDC(hDC); HBITMAP hbmp = CreateCompatibleBitmap(hDC, FP_X, FP_Y); HBITMAP holdbmp = (HBITMAP)SelectObject(memdc, hbmp); rc_line.left = 0; rc_line.top = FP_Y / 2; rc_line.right = FP_X; rc_line.bottom = FP_Y / 2; CRenderEngine::DrawLine(memdc, rc_line, 2, m_colorBKLine); int nOldY = FP_Y / 2; int nY = FP_Y / 2; for (int k = 0; k int nTypeValue; if (g_nFPType == 0) { nTypeValue = FP_Y / 2; } else if (g_nFPType == 1) { nTypeValue = FP_Y; } for (int i = 0; i move_num=move_num+FP_X; } int phase_move_num; //定义旋转多少相位 phase_move_num=move_num%FP_X; for (int j = 0; j if (m_colorBK != GetFPColor(m_sStateMap[i][j])) { HPEN pen = CreatePen(PS_SOLID, 2, GetFPColor(m_sStateMap[i][j])); HGDIOBJ old_pen = SelectObject(memdc, pen); Ellipse(memdc, i, j, i + 1, j + 1); SelectObject(memdc, old_pen); DeletePen(pen); } } } } } 总结Qt画点使用drawPoint,用dui画点要用Ellipse,且right - left = bottom - top。 创建新的HBITMAP要使用CreateCompatibleBitmap而不能用CreateBitmap,原因是CreateBitmap似乎只支持8x8的位图。 画笔、画刷、画布、位图的句柄用完之后一定要释放。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |